package Aula18;

public class TreeSkipImpl implements TreeSkip {

	private Arvore arvore;
	private boolean arvoreInicializado;
	private SkipList skip;
	private boolean skipInicializado;

	public TreeSkipImpl() {
		arvoreInicializado = false;
		skipInicializado = false;
	}

	public Resultado iniciarArvore(int[] vetorDesordenado) {
		Resultado result = new Resultado();
		long fim, inicio;
		inicio = System.nanoTime();
		result.ret = 0;
		arvore = new Arvore();
		arvoreInicializado = true;
		for (int i = 0; i < vetorDesordenado.length; i++) {
			if (vetorDesordenado[i] < 0) {
				arvoreInicializado = false;
				result.ret = -1;
				break;
			}
			arvore.insert(vetorDesordenado[i]);
		}
		fim = System.nanoTime();
		result.tempoExecucao = fim - inicio;
		return result;
	}

	public Resultado iniciarSkip(int[] vetorDesordenado) {
		Resultado result = new Resultado();
		long fim, inicio;
		inicio = System.nanoTime();
		result.ret = 0;
		skip = new SkipList();
		skipInicializado = true;
		for (int i = 0; i < vetorDesordenado.length; i++) {
			if (vetorDesordenado[i] < 0) {
				skipInicializado = false;
				result.ret = -1;
				break;
			}
			skip.insert(vetorDesordenado[i]);
		}
		fim = System.nanoTime();
		result.tempoExecucao = fim - inicio;
		return result;
	}

	public Resultado inserirElementoArvore(int elemento) {
		Resultado result = new Resultado();
		long fim, inicio;
		inicio = System.nanoTime();
		if (arvoreInicializado) {
			result.ret = arvore.insert(elemento);
		} else {
			result.ret = -1;
		}
		fim = System.nanoTime();
		result.tempoExecucao = fim - inicio;
		return result;
	}

	public Resultado inserirElementoSkip(int elemento) {
		Resultado result = new Resultado();
		long fim, inicio;
		inicio = System.nanoTime();
		if (skipInicializado) {
			result.ret = skip.insert(elemento);
		} else {
			result.ret = -1;
		}
		fim = System.nanoTime();
		result.tempoExecucao = fim - inicio;
		return result;
	}

	public Resultado procurarArvore(int elemento) {
		Resultado result = new Resultado();
		long fim, inicio;
		inicio = System.nanoTime();
		if (arvoreInicializado) {
			result.ret = arvore.search(elemento);
		} else {
			result.ret = -1;
		}
		fim = System.nanoTime();
		result.tempoExecucao = fim - inicio;
		return result;
	}

	public Resultado procurarSkip(int elemento) {
		Resultado result = new Resultado();
		long fim, inicio;
		inicio = System.nanoTime();
		if (skipInicializado) {
			result.ret = skip.search(elemento);
		} else {
			result.ret = -1;
		}
		fim = System.nanoTime();
		result.tempoExecucao = fim - inicio;
		return result;
	}

	public static void main(String[] args) {
		TreeSkipImpl ts = new TreeSkipImpl();

		int[] numeros = { 4, 2, 1, 6, 2, 5, 1, 3, 0 };
		Resultado r1 = ts.iniciarArvore(numeros);
		Resultado r2 = ts.iniciarSkip(numeros);

		if (r1.ret >= 0 && r2.ret >= 0) {
			System.out.println(r1.tempoExecucao);
			System.out.println(ts.inserirElementoArvore(3).tempoExecucao);
			System.out.println(ts.procurarArvore(2).tempoExecucao);
			System.out.println();
			System.out.println(r2.tempoExecucao);
			System.out.println(ts.inserirElementoSkip(3).tempoExecucao);
			System.out.println(ts.procurarSkip(2).tempoExecucao);
		}
	}
}
